From 901f77410da876e5663c89d218e2dfb8362af80b Mon Sep 17 00:00:00 2001 From: robertl Date: Thu, 22 May 2003 21:47:11 +0000 Subject: [PATCH] Fix read of PCX. Commonize mag2degrees. From Ian Mahuron. --- gpsbabel/defs.h | 7 +++++++ gpsbabel/magproto.c | 29 ++++------------------------- gpsbabel/pcx.c | 12 ++++-------- gpsbabel/util.c | 15 +++++++++++++++ 4 files changed, 30 insertions(+), 33 deletions(-) diff --git a/gpsbabel/defs.h b/gpsbabel/defs.h index 2c0cdb07f..ef9e5b494 100644 --- a/gpsbabel/defs.h +++ b/gpsbabel/defs.h @@ -363,6 +363,13 @@ void le_write32(void *pp, unsigned i); double pdb_read_double(void *p); void pdb_write_double(void *pp, double d); +/* + * Prototypes for generic conversion routines (util.c). + */ + +double ddmm2degrees(double ddmm_val); +double degrees2ddmm(double deg_val); + /* * A constant for unknown altitude. It's tempting to just use zero * but that's not very nice for the folks near sea level. diff --git a/gpsbabel/magproto.c b/gpsbabel/magproto.c index 9b89ace7b..c5ed33530 100644 --- a/gpsbabel/magproto.c +++ b/gpsbabel/magproto.c @@ -36,7 +36,6 @@ extern gpsdata_type objective; static char * termread(char *ibuf, int size); static void termwrite(char *obuf, int size); -static double mag2degrees(double mag_val); static void mag_readmsg(void); static void mag_handon(void); static void mag_handoff(void); @@ -849,10 +848,10 @@ mag_trkparse(char *trkmsg) waypt->creation_time = mktime(&tm) + get_tz_offset() ; if (latdir == 'S') latdeg = -latdeg; - waypt->position.latitude.degrees = mag2degrees(latdeg); + waypt->position.latitude.degrees = ddmm2degrees(latdeg); if (lngdir == 'W') lngdeg = -lngdeg; - waypt->position.longitude.degrees = mag2degrees(lngdeg); + waypt->position.longitude.degrees = ddmm2degrees(lngdeg); waypt->position.altitude.altitude_meters = alt; @@ -994,26 +993,6 @@ mag_find_token_from_descr(const char *icon) return icon_mapping[0].token; } -static double -mag2degrees(double mag_val) -{ - double minutes; - double tmp_val; - double return_value; - int deg; - - /* - * magellan value is DDMM.MM - * e.g. 36 3.85 would be coded as 3603.85 - */ - tmp_val = mag_val / 100.0; - deg = (int) tmp_val; - minutes = (tmp_val - deg) * 100.0; - minutes /= 60.0; - return_value = (double) deg + minutes; - return return_value; -} - /* * Given an incoming waypoint messages of the form: * $PMGNWPL,3549.499,N,08650.827,W,0000257,M,HOME,HOME,c*4D @@ -1053,10 +1032,10 @@ mag_wptparse(char *trkmsg) icon_token[i++] = '\0'; if (latdir == 'S') latdeg = -latdeg; - waypt->position.latitude.degrees = mag2degrees(latdeg); + waypt->position.latitude.degrees = ddmm2degrees(latdeg); if (lngdir == 'W') lngdeg = -lngdeg; - waypt->position.longitude.degrees = mag2degrees(lngdeg); + waypt->position.longitude.degrees = ddmm2degrees(lngdeg); waypt->position.altitude.altitude_meters = alt; waypt->shortname = xstrdup(shortname); diff --git a/gpsbabel/pcx.c b/gpsbabel/pcx.c index ac36960d2..7faa6888c 100644 --- a/gpsbabel/pcx.c +++ b/gpsbabel/pcx.c @@ -93,7 +93,6 @@ data_read(void) desc); sscanf(&ibuf[116], "%d", &symnum); - desc[sizeof(desc)-1] = '\0'; name[sizeof(name)-1] = '\0'; wpt_tmp = xcalloc(sizeof(*wpt_tmp), 1); @@ -104,8 +103,8 @@ data_read(void) if (latdir == 'S') lat = -lat; if (londir == 'W') lon = -lon; - wpt_tmp->position.longitude.degrees = lon/100.0; - wpt_tmp->position.latitude.degrees = lat/100.0; + wpt_tmp->position.longitude.degrees = ddmm2degrees(lon); + wpt_tmp->position.latitude.degrees = ddmm2degrees(lat); waypt_add(wpt_tmp); break; default: @@ -118,16 +117,13 @@ static void gpsutil_disp(const waypoint *wpt) { double lon,lat; - signed int ilon, ilat; int icon_token = 0; char tbuf[1024]; char *tp = tbuf; time_t tm = wpt->creation_time; - ilon = (signed int)wpt->position.longitude.degrees; - ilat = (signed int)wpt->position.latitude.degrees; - lon = (ilon * 100.0) + (wpt->position.longitude.degrees - ilon) * 60.0; - lat = (ilat * 100.0) + (wpt->position.latitude.degrees - ilat) * 60.0; + lon = degrees2ddmm(wpt->position.longitude.degrees); + lat = degrees2ddmm(wpt->position.latitude.degrees); if (tm == 0) tm = time(NULL); diff --git a/gpsbabel/util.c b/gpsbabel/util.c index d67de4063..d38139105 100644 --- a/gpsbabel/util.c +++ b/gpsbabel/util.c @@ -459,3 +459,18 @@ pdb_write_double(void* ptr, double d) } return; } + +// Magellan and PCX formats use this DDMM.mm format +double ddmm2degrees(double pcx_val) { + double minutes; + signed int deg; + deg = (signed int) (pcx_val / 100.0); + minutes = (((pcx_val / 100.0) - deg) * 100.0) / 60.0; + return (double) deg + minutes; +} + +double degrees2ddmm(double deg_val) { + signed int deg; + deg = (signed int) deg_val; + return (double) (deg * 100.0) + ((deg_val - deg) * 60.0); +} -- 2.30.2